package main

import "fmt"

func main() {
	// // 数组定义
	// // var 变量名 [元素数量]T
	// // 数组的长度是类型的一部分
	// var arr1 [3]int
	// fmt.Printf("arr1:%v, 类型:%T\n", arr1, arr1) // arr1:[3]int

	// // 数组初始化
	// var arr2 [3]bool
	// fmt.Println(arr2)

	// var arr3 = [3]string{"python", "javascript", "golang"}
	// fmt.Printf("arr3:%v, 类型:%T\n", arr3, arr3)

	// 长度自推导, 但长度仍不可改变
	// var arr1 = [...]int{12, 13, 23, 45, 66}
	// fmt.Println(arr1)
	// fmt.Println(len(arr1))

	// // 指定下标初始化,未赋值下标取类型默认值
	// var arr2 = [...]int{0: 1, 1: 10, 5: 50}
	// fmt.Println(arr2)
	// fmt.Println(len(arr2))

	// //数组的循环遍历 for 或 for range
	// var arr2 = [...]int{0: 1, 1: 10, 5: 50}
	// for i := 0; i < len(arr2); i++ {
	// 	fmt.Printf("%v ", arr2[i])
	// }
	// fmt.Println()
	// for _, j := range arr2 {
	// 	fmt.Printf("%v ", j)
	// }

	// 从数组中找到和为8的两个元素，并给出下标
	// var arr = [...]int{1, 3, 5, 7, 8}
	// for i, j := 0, len(arr)-1; i<j; {
	// 	if arr[i]+arr[j] == 8 {
	// 		fmt.Println(i, j)
	// 		i += 1
	// 		j -= 1
	// 	}else if arr[i]+arr[j]<8 {
	// 		i += 1
	// 	}else{
	// 		j -= 1
	// 	}
	// }

	// // 值类型和应用类型
	// // 基本数据类型和数组都是值类型 int,float,bool,string,arry
	// // 切片是引用类型 slice
	// // 值类型相当于python中的不可变对象，C中的值传递
	// // 引用类型相当于python中的可变对象，C中的指针传递
	// var a = 10
	// b := a
	// fmt.Println(a, b)
	// a = 20
	// fmt.Println(a, b)

	// 数组
	// var arr1 = [...]int{1, 2, 3}
	// var arr2 = arr1
	// fmt.Printf("%T-%v %T-%v", arr1, arr1, arr2, arr2)
	// arr2[1] = 11
	// fmt.Printf("%T-%v %T-%v", arr1, arr1, arr2, arr2)

	// 切片
	// var arr1 = []int{1, 2, 3}
	// var arr2 = arr1
	// fmt.Printf("%T-%v %T-%v", arr1, arr1, arr2, arr2)
	// arr2[1] = 11
	// fmt.Printf("%T-%v %T-%v", arr1, arr1, arr2, arr2)

	// 多维数组
	// 一维长度可自动推导，二维长度不可自动推导
	var arr32 = [...][2]int{
		{1, 2},
		{3, 4},
		{5, 6},
	}
	fmt.Println(arr32)
	fmt.Println(arr32[2][1])
	for _, x := range arr32 {
		for _, y := range x {
			fmt.Print(y, " ")
		}
	}
}
